"""
Markdown转换工具 - 用于HTML到Markdown的转换和清理
"""
import html2text
import re
from typing import Optional, Dict, Any
import logging

logger = logging.getLogger(__name__)

class MarkdownConverter:
    def __init__(
        self,
        ignore_links: bool = False,
        ignore_images: bool = False,
        body_width: int = 0,
        wrap_links: bool = True
    ):
        """
        初始化Markdown转换器
        
        Args:
            ignore_links: 是否忽略链接
            ignore_images: 是否忽略图片
            body_width: 正文宽度（0表示不换行）
            wrap_links: 是否包装链接
        """
        self.converter = html2text.HTML2Text()
        self.converter.ignore_links = ignore_links
        self.converter.ignore_images = ignore_images
        self.converter.body_width = body_width
        self.converter.wrap_links = wrap_links
        
        # 自定义配置
        self.converter.unicode_snob = True  # 使用Unicode字符
        self.converter.escape_snob = True   # 转义特殊字符
    
    def convert(self, html_content: str, title: Optional[str] = None) -> str:
        """
        将HTML转换为Markdown
        
        Args:
            html_content: HTML内容
            title: 可选的标题（会添加到Markdown开头）
            
        Returns:
            转换后的Markdown内容
        """
        try:
            markdown = self.converter.handle(html_content)
            
            # 清理多余的空白行
            markdown = self._clean_whitespace(markdown)
            
            # 如果有标题，添加到开头
            if title:
                markdown = f"# {title}\n\n{markdown}"
            
            return markdown
            
        except Exception as e:
            logger.error(f"HTML转换失败: {e}")
            return ""
    
    def _clean_whitespace(self, text: str) -> str:
        """清理多余的空白行"""
        # 替换多个连续空行为两个空行
        text = re.sub(r'\n\s*\n\s*\n', '\n\n', text)
        # 替换两个以上连续空行为两个空行
        text = re.sub(r'\n{3,}', '\n\n', text)
        return text.strip()
    
    def extract_main_content(self, html_content: str) -> str:
        """
        尝试提取主要内容（去除导航、页脚等）
        这是一个简单的实现，对于复杂页面可能需要更高级的算法
        """
        # 这里可以使用更复杂的内容提取算法
        # 例如基于标签密度、类名等的启发式方法
        
        # 简单实现：移除常见的非内容标签
        patterns = [
            r'<nav.*?>.*?</nav>',
            r'<footer.*?>.*?</footer>',
            r'<header.*?>.*?</header>',
            r'<aside.*?>.*?</aside>',
            r'<script.*?>.*?</script>',
            r'<style.*?>.*?</style>',
        ]
        
        cleaned_html = html_content
        for pattern in patterns:
            cleaned_html = re.sub(pattern, '', cleaned_html, flags=re.DOTALL | re.IGNORECASE)
        
        return cleaned_html
    
    def convert_with_cleanup(self, html_content: str, title: Optional[str] = None) -> str:
        """
        先清理HTML再转换为Markdown
        
        Args:
            html_content: HTML内容
            title: 可选的标题
            
        Returns:
            清理后的Markdown内容
        """
        cleaned_html = self.extract_main_content(html_content)
        return self.convert(cleaned_html, title)

# 工具函数
def create_markdown_payload(
        title: str,
        content: str,
        source_url: str,
        category: str = "web_crawler",
        tags: Optional[list] = None
    ) -> Dict[str, Any]:
    """
    创建上传到SpringBoot的Markdown数据负载
    
    Args:
        title: 文章标题
        content: Markdown内容
        source_url: 源URL
        category: 分类
        tags: 标签列表
        
    Returns:
        格式化后的数据字典
    """
    payload = {
        "title": title,
        "content": content,
        "sourceUrl": source_url,
        "category": category,
        "tags": tags or [],
        "format": "markdown"
    }
    return payload